package com.lenovo.agricultureclient.request;

/**
 * @author zongbingwu
 * 协议请求基类
 * 一个协议请求对象要提供请求协议类型、请求动作名称和请求body三组数据
 * 并提供回应数据的解析函数，
 * 基类提供请求协议类型
 * 子类要提供请求动作名称、各种协议下的获取body的函数，以及各种协议下解析回应的函数
 */
public abstract class BaseRequest
{
	//请求结果
	public enum RequestResult
	{
		RESULT_FAIL,
		RESULT_SUCCESS,
		RESULT_NO_NET;
	}
	
	//回调接口，将请求结果通知给调用者
	public interface OnResponseEventListener
	{
		/**
		 * 将请求结果通知给调用者
		 * @param request 请求对象
		 * @param result	请求的结果
		 */
		void onResponse(BaseRequest request, RequestResult result);
	}
	
	//请求目前支持jason和soap两种协议
	public static final String PROTOCOL_JASON 	= "jason";
	public static final String PROTOCOL_SOAP 	= "soap";
	
	//协议类型
	private String protocolType; 
	//存放服务器端的回应报文
	private String responseStr;  
	//请求结果的回调函数
	private OnResponseEventListener responseEventListener;
	
	public BaseRequest(String portocolType)
	{
		this.protocolType = portocolType;
	}
	//获取协议类型
	public String getProtocolType() {
		return protocolType;
	}
	public void setProtocolType(String protocolType) {
		this.protocolType = protocolType;
	}
	public void setOnResponseEventListener(OnResponseEventListener responseEventListener) {
		this.responseEventListener = responseEventListener;
	}

	//获取请求body,该函数供请求执行线程调用
	public String getBody()
	{
		if(protocolType.equals(PROTOCOL_JASON)){
			//jason协议时的获取body函数
			return onGetJasonBody();
		} else if(protocolType.equals(PROTOCOL_SOAP)){
			//soap协议时的获取body函数
			return onGetSoapBody();
		}
		return null;
	}
	
	//解析服务器端的回应数据
	public void parseResult(RequestResult result)
	{
		if(responseStr!=null)
		{
			if(protocolType.equals(PROTOCOL_JASON)){
				//当前是jason协议时解析回应函数
				onJasonParese(responseStr);
			} else if(protocolType.equals(PROTOCOL_SOAP)){
				//当前是soap协议时解析回应函数
				onSoapParese(responseStr);
			}
		}
		//将请求结果通知给调用者
		if(responseEventListener != null){
			responseEventListener.onResponse(this, result);
		}
	}
	
	public void setResponseStr(String responseStr) {
		this.responseStr = responseStr;
	}

	//获取action名称，以下虚函数要求子类实现
	protected abstract String getActionName(); // 获取当前请求动作名称
	
	//当前是jason协议时的获取body函数,要求子类覆盖定义该函数
	protected String onGetJasonBody()
	{
		return null;
	}
	
	//当前是jason协议时解析回应函数,要求子类覆盖定义该函数
	protected void onJasonParese(String responseStr) {} 
	
	//当前是soap协议时的获取body函数,要求子类覆盖定义该函数
	protected String onGetSoapBody()
	{
		return null;
	}
	
	//当前是soap协议时解析回应函数,要求子类覆盖定义该函数
	protected void onSoapParese(String responseStr){} 
}
